/*
 * @Description: ------------ fileDescription -----------
 * @Author: snows_l snows_l@163.com
 * @Date: 2024-08-07 22:07:34
 * @LastEditors: snows_l snows_l@163.com
 * @LastEditTime: 2025-01-20 12:43:31
 * @FilePath: \BLOG\src\utils\common.js
 */

import { ElMessage, ElNotification } from 'element-plus';
import moment from 'moment';

// 重写 localStorage 的 setItem 方法，派发自定义事件 用于监听  localStorage 的变化
export const dispatchEventStroage = () => {
  const signSetItem = localStorage.setItem;
  localStorage.setItem = function (key, val) {
    // 声明事件
    let setEvent = new Event('storageEvent');
    setEvent.key = key;
    setEvent.newValue = val;
    // 派发事件
    window.dispatchEvent(setEvent);
    signSetItem.apply(this, arguments);
  };
};

// 根据QQ号获取QQ头像地址
export const getQQAvatar = (qq = '37523953') => {
  return 'http://q1.qlogo.cn/g?b=qq&nk=' + encodeURIComponent(qq) + '&s=640';
};

// 根据QQ号获取QQ信息
export const getInfoByQQ = (qq = '37523953') => {
  return new Promise((resolve, reject) => {
    let url = 'https://api.qster.top/API/v1/qqall/?qq=';
    axios
      .get(url + qq)
      .then(response => {
        resolve(response.data);
      })
      .catch(error => {
        reject(error);
        console.error('Error:', error);
      });
  });
};

// 判断当前 视口 是否小于 w 像素
const { body } = document;
export const isMobile = (w = 920) => {
  const rect = body.getBoundingClientRect();
  return rect.width - 1 <= w;
};

// 设置网页标题
export const setDocmentTitle = title => {
  document.title = title;
};

// 产生min~max之间的随机数
export const randomNum = (min = 1, max = 1) => {
  return Math.floor(Math.random() * (max - min + 1) + min);
};

// 复制文本到剪贴板
export const copyToClipboard = data => {
  if (document.execCommand('copy')) {
    const textArea = document.createElement('textarea');
    textArea.value = data.content || data.text;
    textArea.style.position = 'absolute';
    textArea.style.opacity = '0';
    textArea.style.left = '-999999px';
    textArea.style.top = '-999999px';
    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();
    if (!document.execCommand('copy')) {
      throw new Error('Copy command failed');
    }
    textArea.remove();
    data.success && data.success('success');
  } else {
    navigator.clipboard
      .writeText(data.content || data.text)
      .then(function () {
        data.success && data.success();
        console.log('Copied to clipboard successfully');
      })
      .catch(function (err) {
        data.error && data.error(err);
        console.error('Unable to copy text to clipboard', err);
      });
  }
};

// 获取后台管理
export const getBackstageurl = () => {
  return import.meta.env.VITE_BACKSTAGE_URL;
};

// 获取 时间
export const getTime = time => {
  return moment(time).format('MM月DD日 HH:mm');
};

/**
 * @description 构造树型结构数据
 * @param { Array } data 数据源
 * @param { String } id id字段 默认 'id'
 * @param { String } parentId 父节点字段 默认 'parentId'
 * @param { String } children 孩子节点字段 默认 'children'
 */
export function tranListToTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  };
  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];
  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }
  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      tree.push(d);
    }
  }
  for (let t of tree) {
    adaptToChildrenList(t);
  }
  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  function setLevel(t, level) {
    t.__level__ = level;
    if (!t.children || !t.children.length) return;
    t.children.forEach(t => setLevel(t, level + 1));
  }
  tree.forEach(t => setLevel(t, 0));
  return tree;
}

// 获取 图片Icon
export const getImgIcon = name => {
  return new URL(`../assets/images/icon/${name}`, import.meta.url).href;
};

/**
 * 获取某个日期的农历
 * @parmas {newDate} 日期 年-月-日
 */
export const getLunar = newDate => {
  var nyear;
  var nmonth;
  var nday = -1;
  var nwday;
  var nhrs;
  var nmin;
  var nsec;
  var newDate = newDate;

  var lmonth, lday, lleap; //农历参数

  function Draw() {
    NewTick();

    //显示时间
    var s = nyear + '年' + nmonth + '月' + nday + '日 ' + '星期' + cweekday(nwday) + ' ' + shapetime(nhrs, nmin, nsec);
    s += ' 农历' + lmonth + '月' + lday; //农历
    var lunar_month_day = lmonth + '月' + lday;
    return lunar_month_day;
  }

  function NewTick() {
    var noww = newDate ? new Date(newDate) : new Date();
    if (noww.getDate() != nday) {
      nyear = noww.getFullYear();
      nmonth = noww.getMonth() + 1;
      nwday = noww.getDay();
      nday = noww.getDate();

      getlunar(); //获取农历
    }
    nhrs = noww.getHours();
    nmin = noww.getMinutes();
    nsec = noww.getSeconds();
  }

  //辅助函数
  var hzWeek = new Array('日', '一', '二', '三', '四', '五', '六', '日');
  function cweekday(wday) {
    return hzWeek[wday];
  }
  function shapetime(vhrs, vmin, vsec) {
    if (vsec <= 9) vsec = '0' + vsec;
    if (vmin <= 9) vmin = '0' + vmin;
    if (vhrs <= 9) vhrs = '0' + vhrs;
    return vhrs + ':' + vmin + ':' + vsec;
  }

  //农历函数开始
  var lunarInfo = new Array(
    0x04bd8,
    0x04ae0,
    0x0a570,
    0x054d5,
    0x0d260,
    0x0d950,
    0x16554,
    0x056a0,
    0x09ad0,
    0x055d2,
    0x04ae0,
    0x0a5b6,
    0x0a4d0,
    0x0d250,
    0x1d255,
    0x0b540,
    0x0d6a0,
    0x0ada2,
    0x095b0,
    0x14977,
    0x04970,
    0x0a4b0,
    0x0b4b5,
    0x06a50,
    0x06d40,
    0x1ab54,
    0x02b60,
    0x09570,
    0x052f2,
    0x04970,
    0x06566,
    0x0d4a0,
    0x0ea50,
    0x06e95,
    0x05ad0,
    0x02b60,
    0x186e3,
    0x092e0,
    0x1c8d7,
    0x0c950,
    0x0d4a0,
    0x1d8a6,
    0x0b550,
    0x056a0,
    0x1a5b4,
    0x025d0,
    0x092d0,
    0x0d2b2,
    0x0a950,
    0x0b557,
    0x06ca0,
    0x0b550,
    0x15355,
    0x04da0,
    0x0a5b0,
    0x14573,
    0x052b0,
    0x0a9a8,
    0x0e950,
    0x06aa0,
    0x0aea6,
    0x0ab50,
    0x04b60,
    0x0aae4,
    0x0a570,
    0x05260,
    0x0f263,
    0x0d950,
    0x05b57,
    0x056a0,
    0x096d0,
    0x04dd5,
    0x04ad0,
    0x0a4d0,
    0x0d4d4,
    0x0d250,
    0x0d558,
    0x0b540,
    0x0b6a0,
    0x195a6,
    0x095b0,
    0x049b0,
    0x0a974,
    0x0a4b0,
    0x0b27a,
    0x06a50,
    0x06d40,
    0x0af46,
    0x0ab60,
    0x09570,
    0x04af5,
    0x04970,
    0x064b0,
    0x074a3,
    0x0ea50,
    0x06b58,
    0x05ac0,
    0x0ab60,
    0x096d5,
    0x092e0, //1990
    0x0c960,
    0x0d954,
    0x0d4a0,
    0x0da50,
    0x07552,
    0x056a0,
    0x0abb7,
    0x025d0,
    0x092d0,
    0x0cab5,
    0x0a950,
    0x0b4a0,
    0x0baa4,
    0x0ad50,
    0x055d9,
    0x04ba0,
    0x0a5b0,
    0x15176,
    0x052b0,
    0x0a930,
    0x07954,
    0x06aa0,
    0x0ad50,
    0x05b52,
    0x04b60,
    0x0a6e6,
    0x0a4e0,
    0x0d260,
    0x0ea65,
    0x0d530,
    0x05aa0,
    0x076a3,
    0x096d0,
    0x04bd7,
    0x04ad0,
    0x0a4d0,
    0x1d0b6,
    0x0d250,
    0x0d520,
    0x0dd45,
    0x0b5a0,
    0x056d0,
    0x055b2,
    0x049b0,
    0x0a577,
    0x0a4b0,
    0x0aa50,
    0x1b255,
    0x06d20,
    0x0ada0,
    0x14b63
  );
  function lYearDays(y) {
    var i,
      sum = 348;
    for (i = 0x8000; i > 0x8; i >>= 1) sum += lunarInfo[y - 1900] & i ? 1 : 0;
    return sum + leapDays(y);
  }
  function leapDays(y) {
    if (leapMonth(y)) return lunarInfo[y - 1900] & 0x10000 ? 30 : 29;
    else return 0;
  }
  function leapMonth(y) {
    return lunarInfo[y - 1900] & 0xf;
  }
  function monthDays(y, m) {
    return lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29;
  }
  function Lunar(y, m, d) {
    var i,
      leap = 0,
      temp = 0;
    var offset = (Date.UTC(y, m, d) - Date.UTC(1900, 0, 31)) / 86400000;
    for (i = 1900; i < 2050 && offset > 0; i++) {
      temp = lYearDays(i);
      offset -= temp;
    }
    if (offset < 0) {
      offset += temp;
      i--;
    }
    this.year = i;
    leap = leapMonth(i);
    this.isLeap = false;
    for (i = 1; i < 13 && offset > 0; i++) {
      if (leap > 0 && i == leap + 1 && this.isLeap == false) {
        --i;
        this.isLeap = true;
        temp = leapDays(this.year);
      } else {
        temp = monthDays(this.year, i);
      }
      if (this.isLeap == true && i == leap + 1) this.isLeap = false;
      offset -= temp;
    }
    if (offset == 0 && leap > 0 && i == leap + 1)
      if (this.isLeap) {
        this.isLeap = false;
      } else {
        this.isLeap = true;
        --i;
      }
    if (offset < 0) {
      offset += temp;
      --i;
    }
    this.month = i;
    this.day = offset + 1;
  }
  var nStr1 = new Array('', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二');
  var nStr2 = new Array('初', '十', '廿', '卅', '□');
  function GetcDay(d) {
    var s;
    switch (d) {
      case 10:
        s = '初十';
        break;
      case 20:
        s = '二十';
        break;
      case 30:
        s = '三十';
        break;
      default:
        s = nStr2[Math.floor(d / 10)];
        s += nStr1[d % 10];
        break;
    }
    return s;
  }
  function GetcMon(m) {
    if (m == 1) return '正';
    else return nStr1[m];
  }
  function getlunar() {
    var lObj = new Lunar(nyear, nmonth - 1, nday);
    lmonth = GetcMon(lObj.month);
    lday = GetcDay(lObj.day);
    lleap = lObj.isLeap;
    if (lleap == 1) {
      lmonth = '闰' + lmonth;
    }
  }
  //农历函数结束
  return Draw();
};

import { useAppStore } from '@/store/app';
import axios from 'axios';
// 切换背景图片
export const changeBgImg = name => {
  const appStore = useAppStore();
  let preFix = appStore.projectConfig.assetsPrefix;
  let bgMaxLen = appStore.projectConfig.bgImgMaxLen;
  let url = '';
  if (name) {
    url = preFix + '/imgs/bg/' + name + '.png';
  } else {
    const num = randomNum(1, bgMaxLen);
    appStore.SET_BG_INDEX(num);
    url = preFix + '/imgs/bg/' + num + '.png';
  }
  return url;
};

// 根据文件名获取在线文件地址获取在线图片
export const getOnlineImgUrl = folderAndFileName => {
  const appStore = useAppStore();
  let preFix = appStore.projectConfig.assetsPrefix;
  return preFix + folderAndFileName;
};

// 下载阅览地址的文件
export const downloadFileOfPreviewUrl = (url, filename) => {
  fetch(url)
    .then(response => response.blob())
    .then(blob => {
      // 创建一个隐藏的<a>标签
      const blobUrl = URL.createObjectURL(blob);
      const a = window.document.createElement('a');
      a.setAttribute('target', '_blank');
      a.setAttribute('download', filename); // 如果服务器端设置了CORS策略，可能需要设置正确的响应头以允许跨域下载
      a.href = blobUrl;
      a.style.display = 'none';
      document.body.appendChild(a);
      a.click(); // 模拟点击事件，开始下载
      document.body.removeChild(a); // 下载完成后移除<a>标签
    });
};

// 反馈提示
export const CustomMessage = config => {
  let defaultConfig = {
    type: 'success',
    title: '',
    icon: '',
    msg: '操作成功'
  };
  if (!isMobile()) {
    ElNotification({
      type: config.type == 'welcome' ? null : config.type || defaultConfig.type,
      title: config.title || defaultConfig.title,
      message: config.msg || config.message || defaultConfig.msg,
      offset: 80
    });
  } else {
    ElMessage({
      type: config.type || defaultConfig.type,
      message: config.msg || config.message || defaultConfig.msg,
      offset: 31,
      center: true,
      plain: true,
      icon: config.icon || defaultConfig.icon,
      customClass: config.customClass || ''
    });
  }
};

// 检测违禁词
export const checkForbiddenWord = str => {
  return new Promise((resolve, reject) => {
    axios
      .get('https://v.api.aa1.cn/api/api-mgc/index.php?msg=' + str, {
        headers: { 'Content-Type': 'application/json' }
      })
      .then(response => {
        resolve(response.data);
      })
      .catch(error => {
        resolve('{"code":200,"desc":"暂无敏感词"}');
      });
  });
};
